package com.yxc.jnademo.jni;

import com.sun.jna.Library;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.ByReference;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.LongByReference;
import com.sun.jna.ptr.PointerByReference;

public interface SkfApi extends Library {

    /**
     * 接口内部需要一个公共静态常量INSTANCE，通过这个常量就可以获得这个接口的实例，从而使用接口的方法，也就是调用外部dll/so/dylib的函数
     * 该常量通过Native.load()这个API获得
     * 第一个参数为共享库的名称（不带后缀）
     * 第二个参数为本接口的Class类型，JNA通过这个这个Class类型，反射创建接口的实例
     * 共享库的查找顺序是：
     *  先从当前类的当前文件夹找，如果没找到
     *  再从工程当前文件夹下面找，如果找不到
     *  最后在当前平台下面去搜索
     */
    SkfApi INSTANCE = Native.load("SKFAPI40248", SkfApi.class);

    public static void main(String[] args) {
        LongByReference pulSize = new LongByReference();
        PointerByReference nameList = new PointerByReference();
        ByteByReference test = new ByteByReference();
        Pointer a = new Memory(255);
        Long l = SkfApi.INSTANCE.SKF_EnumDev(Boolean.TRUE, a, pulSize);
        //
        System.out.println(l);
        System.out.println(Long.toHexString(l));
        System.out.println(pulSize.getValue());
        System.out.println(nameList.getValue());
        System.out.println(test.getValue());
        System.out.println(a.getString(0));
    }

    /**
     * 函数原型：ULONG DEVAPI SKF_EnumDev(BOOL bPresent, LPSTR szNameList, ULONG * pulSize)
     * 功能描述：获得当前系统中的设备列表。
     * 参数：    bPresent ：    [IN]为TRUE 表示取当前设备状态为存在的设备列表。 为FALSE表示取当前驱动支持的设备列表。
     *          szNameList ：  [OUT]设备名称列表。 如果该参数为NULL，将由pulSize返回所需要的内存空间大小。 每个设备的名称以单个＇ ＼们结束，以双 ＇＼矿表示列表的结束。
     *          pulSize ：     [IN,OUT]输入时表示设备名称列表的缓冲区长度， 输出时表示szNameList所占用的空间大小。
     * 返回值：SAR_OK: 成功。
     *          其他：错误码。
     */
    public Long SKF_EnumDev(Boolean bPresent, Pointer szNameList, ByReference pulSize);
}
